package testes;
import java.util.ArrayList;
import java.util.HashMap;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import Exceptions.DadosInsuficientesExceptions;
import Exceptions.LoginJaCadastradoException;
import Exceptions.UsuarioInexistenteException;

import classes.Cadastra;
import classes.Endereco;
import classes.Usuario;


public class CadastraTest {
	private Usuario user, user2;
	private Endereco e1;
	private Cadastra sistema;
	
	@Before
	public void setUp() throws Exception{
		e1 = new Endereco("Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		user = new Usuario("Usuario teste","moraesQuer",e1);
		sistema = new Cadastra();
		
	}
	
	@Test
	public void testConstrutor(){
		sistema = new Cadastra();
		Assert.assertEquals("Erro no construtor" , 0, sistema.getCadastro().size());
	}
	
	@Test
	public void testListaUsuariosPorNome() throws Exception{
		ArrayList<Usuario> usuariosEncontrados = new ArrayList<Usuario>();
		usuariosEncontrados.add(user);
		
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		sistema.cadastra("Usuario teste2", "moraesQuerSim", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		
		Assert.assertEquals("Erro no metodo lista usuarios", usuariosEncontrados, sistema.listaUsuarios("Usuario teste"));
		
	}
	
	@Test
	public void testListaUsuariosPorEndereco() throws Exception{
		ArrayList<Usuario> usuariosEncontrados = new ArrayList<Usuario>();
		usuariosEncontrados.add(user);
		
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		sistema.cadastra("Usuario teste2", "moraesQuerSim", "Rua teste2", "1231", "Bairro teste2", "Cidade teste2", "Estado teste2", "Complemento teste2");
		
		Assert.assertEquals("Erro no metodo lista usuarios", usuariosEncontrados, sistema.listaUsuarios("Rua teste"));
		
	}
	
	@Test
	public void testGetCadastro() throws Exception{
		HashMap<String, Usuario> cadastro = new HashMap<String, Usuario>();
		cadastro.put("moraesQuer", user);
		
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		Assert.assertEquals("Erro no metodo get cadastro", cadastro, sistema.getCadastro());
	}
	
	@Test(expected=LoginJaCadastradoException.class)
	public void testCadastraLoginJaCadastrado() throws Exception{
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
	}
	
	@Test
	public void testCadastra() throws Exception{
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		Assert.assertEquals("Erro no metodo cadastra", 1, sistema.getCadastro().size());
		sistema.cadastra("Usuario teste2", "moraesQuerSim", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		Assert.assertEquals("Erro no metodo cadastra", 2, sistema.getCadastro().size());
	}
	
	@Test(expected=DadosInsuficientesExceptions.class)
	public void testAcessaUsuarioLoginNull() throws DadosInsuficientesExceptions{
		sistema.acessaUsuario(null);
	}
	
	@Test(expected=DadosInsuficientesExceptions.class)
	public void testAcessaUsuarioLoginVazio() throws DadosInsuficientesExceptions{
		sistema.acessaUsuario("");
	}
	
	@Test
	public void testAcessaUsuario() throws Exception{
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		Assert.assertEquals("Erro no testAcessaUsuario", user, sistema.acessaUsuario("moraesQuer"));
	}
	
	@Test(expected=UsuarioInexistenteException.class)
	public void testRemoveUsuarioInexistente() throws UsuarioInexistenteException, DadosInsuficientesExceptions{
		sistema.removeUsuario("moraesQuerSim");
	}
	
	@Test
	public void testRemoveUsuario() throws Exception{
		sistema.cadastra("Usuario teste", "moraesQuer", "Rua teste", "123", "Bairro teste", "Cidade teste", "Estado teste", "Complemento teste");
		Assert.assertEquals("Erro no metodo remove usuario", 1, sistema.getCadastro().size());
		sistema.removeUsuario("moraesQuer");
		Assert.assertEquals("Erro no metodo remove usuario", 0, sistema.getCadastro().size());
	}
	
	
}


